package com.zmn.mcc.persistence.interfaces.dept;

import com.zmn.common.dto.StatusDTO;
import com.zmn.common.dto.VtDTO;
import com.zmn.mcc.model.entity.dept.DeptIdAndRoleId;
import com.zmn.mcc.model.entity.dept.McDept;
import com.zmn.mcc.model.entity.dept.McDeptQuery;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * @author heguanghua
 * @since 2020/04/14 10:38
 */
public interface DeptDao {

    McDept findByKey(Integer deptId);

    List<McDept> listPageByQuery(McDeptQuery query);

    List<McDept> listByQuery(McDeptQuery query);


    List<McDept> listByParentIds(@Param("deptIds") List<Integer> deptIds, @Param("status") Integer status);

    /**
     * 描述: 查询有效的部分
     *
     * @return java.util.List<com.zmn.mcc.model.entity.dept.McDept>
     * @author guoqiao
     * @since 2021/3/2 10:44
     */
    List<McDept> listValidDept();

    /**
     * 描述: 查询啄木鸟有效的部门信息
     *
     * @return java.util.List<com.zmn.mcc.model.entity.dept.McDept>
     * @author hedaiping
     * @since 2022/5/24 18:58
     */
    List<McDept> listValidZmnDept();


    /**
     * 根据组织id列表、部门ID列表，查询部门ID列表下的所有子部门
     *
     * @param orgIds  组织id列表
     * @param deptIds 部门ID列表
     * @return 所有子部门id、名称、状态
     * @author xujie
     * @since 2021-05-17
     */
    List<VtDTO> listSubDeptVtByOrgIdsAndDeptIds(@Param("orgIds") List<Integer> orgIds,
                                                @Param("deptIds") List<Integer> deptIds);

    /**
     * 描述: 根据部门id集合查询角色Id
     *
     * @param deptIdList 部门id集合
     * @return List<DeptIdAndRoleId>
     * @author xujie
     * @since 2021/05/28
     **/
    List<DeptIdAndRoleId> listDeptIdAndRoleIdByDeptIdList(@Param("deptIdList") List<Integer> deptIdList);

    Integer countByQuery(McDeptQuery query);

    Integer updateByKey(McDept dept);

    Integer updateRoleId(McDept dept);

    Integer updateStatus(McDept dept);

    Integer updateStatusBatch(StatusDTO dto);

    Integer updateSort(McDept dept);

    /**
     * 描述: 根据parentId更新level
     *
     * @param parentId
     * @param level 父部门level
     * @return int
     * @author jiafei
     * @since 2021/10/11 9:41
     */
    int updateLevelByParentId(@Param("parentId") Integer parentId, @Param("level") Integer level);


    Integer insert(McDept dept);


    Integer deleteByKey(Integer deptId);

    /**
     * 通过北森部门ID查询部门信息
     *
     * @param bsDeptIds 北森部门ID
     * @return
     */
    List<McDept> listByBsDeptId(List<Integer> bsDeptIds);

    McDept findByBsDeptId(@Param("bsDeptId") Integer bsDeptId);

    int countByBsDeptIdAndNotDeptId(@Param("deptId") Integer deptId, @Param("bsDeptId") Integer bsDeptId);

    void updateBsDeptIdByDeptId(@Param("deptId") Integer deptId, @Param("bsDeptId") Integer bsDeptId, @Param("updater") String updater);
}
